package com.example.snake;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * @author Jason
 * @PACKAGE_NAME com.example.snake
 * @Description 绘制窗体 绘制图形 绘制蛇的身体 动起来【窗口一直重绘，修改坐标】
 * @date 2023-12-07 16:04
 */
//继承Frame父类
public class SnackFrame04 extends Frame {
    private int moveDistance = 1; // 减少移动距离
    /*控制程序是否继续*/
    private boolean isRunning = true;
    /**
     * 蛇的主体部分
     */
    private Node[] body = {
            new Node(140, 100),
            new Node(120, 100),
            new Node(100, 100)
    };

    // 构造器中初始化窗体
    public SnackFrame04() {
        int width = 600;
        int height = 500;
        //设置距离显示器距离
        //        this.setLocation(200,100);
        //获取屏幕尺寸
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        //计算窗口左上角x坐标
        int x = (screenSize.width - width) / 2;
        //计算窗口左上角y坐标
        int y = (screenSize.height - height) / 2;
        //设置窗口位置
        this.setLocation(x, y);
        //设置窗口大小
        this.setSize(width, height);
        //设置背景色
        this.setBackground(Color.magenta);
        this.setTitle("贪吃蛇V1.0");
        //禁止改变窗体大小
        this.setResizable(false);
        //显示窗体
        this.setVisible(true);
        //添加窗口监听
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                //退出虚拟机
                System.exit(0);
            }
        });
        start();
    }

    /**
     * 绘制窗体内容
     * 窗体显示 | 更新 自动调用
     *
     * @param g 画笔
     */
    @Override
    public void paint(Graphics g) {
        g.setColor(Color.ORANGE);
        for (int i = 0; i < body.length; i++) {
            //蛇的主体部分
            body[i].drawNode(g, i);
        }
        System.out.println("动起来");
    }

    /**
     * 重绘窗体
     */
    public void start() {
        while (isRunning) {
            move();
            super.repaint();//手动让窗体重绘
            try {
                Thread.sleep(1000);//间隔多长时间重绘一次
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    /**
     * 通过修改坐标达到移动效果
     */
    public void move() {
        /*向右移动*/
        /**
         *1. 每次给一个新的头节点，去掉尾节点
         * 2. 整体移动
         */
        Node[] temp = new Node[body.length];
        //拷贝数组 原数组，哪个地方开始拷贝，目标数组，目标数组的哪里，拷贝的长度
        System.arraycopy(body, 0, temp, 1, body.length - 1);
        temp[0] = new Node(body[0].getX() + 20, body[0].getY());
        this.body = temp;
    }

//    public static void main(String[] args) {
//        new SnackFrame04();
//    }
}
